iT邦幫忙

2024 iThome 鐵人賽

DAY 22
0
佛心分享-SideProject30

從卡關到通關的Spring Boot 腦內風暴系列 第 22

錯誤也能優雅設計-選擇正確的 HTTP 狀態碼

  • 分享至 

  • xImage
  •  

與前端合作開發的過程,會發現錯誤響應的設計也是非常重要的,不僅能讓後端開發者快速了解問題,也能讓前端人員更好理解處理。在Spring Framework有提供相關功能,Spring Boot則是進行簡化與增強,使用適當的HTTP狀態碼能更清楚表現不同的錯誤狀況。

常見的HTTP狀態碼

Http狀態碼是標準Http協議其中一部分,任何web框架都能使用狀態碼表達請求的成功或失敗。
Http常見的狀態碼如下,選擇適當的狀態碼,能夠讓API了解使用操作發生的錯誤情況為何,有利於後續對不同的錯誤提供不同的情境處理。

  • 2XX狀態碼(成功)
    • 200 OK:成功請求並返回結果。
    • 201 Created:資料成功創建。
  • 3XX狀態碼(重定向)
    • 304 Not Modified:自前次訪問後未被修改的資源。前端可以使用快取版本。
  • 4XX狀態碼(客戶端錯誤)
    • 400 Bad Request:無效請求,常用於參數錯誤或格式不對。
    • 401 Unauthorized:用戶未授權或是沒有提供有效憑證。
    • 403 Forbidden:用戶有身份但無權限訪問。
    • 404 Not Found:資源找不到或是路徑錯誤。
  • 5XX狀態碼(伺服器錯誤)
    • 500 Internal Server Error:伺服器遇到意外錯誤,導致請求無法完成。
    • 503 Service Unavailable:伺服器暫時無法處理請求,可能是過載或維護中。

Spring Boot設計錯誤響應

Spring、Spring Boot可以透過以下註解指定HTTP狀態碼,也能使用自定義Exception Handler統一處理錯誤,返回對應的HTTP狀態碼。

@ResposeStatus 設定HTTP狀態碼

@ResponseStatus(HttpStatus.BAD_REQUEST) // Spring自動返回400 Bad Request狀態碼
public class BadRequestException extends RuntimeException {
    public BadRequestException(String message) {
        super(message);
    }
}

@ControllerAdvice、@ExceptionHandler 處理全局異常

這兩個註解是Spring Framework核心功能,而Spring Boot進一步簡化,使用上更方便:

@ControllerAdvice // 定義全局異常處理器
public class GlobalExceptionHandler {
    @ExceptionHandler(BadRequestException.class) // 針對特定例外類型處理
    public ResponseEntity<Object> handleBadRequest(BadRequestException ex) { // 建構響應體,指定狀態碼
        Map<String, Object> body = new HashMap<>();
        body.put("error", "Bad Request");
        body.put("message", ex.getMessage());
        return new ResponseEntity<>(body, HttpStatus.BAD_REQUEST);
    }
}

自定義錯誤響應格式

也是透過Spring功能,並使用Spring Boot的ResponseEntity自定義:

public class ApiError {
    private String status;
    private String message;
    private List<String> errors;
}

@ExceptionHandler(BadRequestException.class)
public ResponseEntity<ApiError> handleBadRequest(BadRequestException ex) {
    List<String> errors = Arrays.asList(ex.getMessage());
    ApiError apiError = new ApiError(HttpStatus.BAD_REQUEST.toString(), "Invalid Error", errors);
    return new ResponseEntity<>(apiError, HttpStatus.BAD_REQUEST);
}

可以讓返回的錯誤訊息格式統一,前端能更好解析錯誤訊息。

錯誤響應的好處

  • API錯誤響應格式一致,前端人員方便處理。
  • 傳遞足夠的錯誤訊息,像是錯誤類型、問題描述。
  • 避免將伺服器細節錯誤返回,提高安全性。
  • 提供合適的HTTP狀態碼,避免誤導使用者。

綜合上述,良好的錯誤響應對於前端或後端人員都能更好開發,提升使用體驗,利用Spring Boot更能靈活自定義處理錯誤,並使用HTTP狀態來精準表達錯誤。


上一篇
一樣都能認證,我該選擇誰?-Token 與 Session
下一篇
全場我Hand住-@ControllerAdvice 與 ExceptionHandler
系列文
從卡關到通關的Spring Boot 腦內風暴30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言